package com.zdp.leetcodeMiddle;

/*
* 题目描述：
* 给你一个以 (radius, x_center, y_center) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2)，其中 (x1, y1) 是矩形左下角的坐标，(x2, y2) 是右上角的坐标。
如果圆和矩形有重叠的部分，请你返回 True ，否则返回 False 。
换句话说，请你检测是否 存在 点 (xi, yi) ，它既在圆上也在矩形上（两者都包括点落在边界上的情况）。
来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/circle-and-rectangle-overlapping
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
* */
public class 圆和矩形是否有重叠 {
    /*
    * 解题思路：
    * 根据圆点所在的不同区域，它与矩阵之间的最短距离也不同
    * 所以先根据y来划分，划分成三个区域：1.在矩形的上方 2.和矩形在同一水平 3.在矩形的下方
    * 1. 在矩形的上方，又可以根据x来分为3个区域，在矩形的左上方，正上方，右上方
    * 不同的位置，计算距离所用的点就不同 左上方：圆点与矩形左上角坐标 正上方：圆点与与圆点同一x的矩形坐标 右上方：圆点与矩形右上角坐标
    * 2. 同一水平 根据x可以分为3个区域：左 中 右  其中，在矩阵的中区域的圆点一定与矩形的重叠
    * 3. 下方 也可以根据x分为3个区域：与上面类似 不再赘述
    * */
    public boolean checkOverlap(int radius, int x_center, int y_center, int x1, int y1, int x2, int y2) {
        boolean flag = false;
        int length = 0;
        //根据y来划分圆可能在的区域
        if(y_center>y2){ //矩形上方
            //根据x坐标来计算圆是否与矩形有重叠
            if(x_center<x1){
                length = getLength(x_center,y_center,x1,y2);
            }else if(x_center<=x2){
                length = getLength(x_center,y_center,x_center,y2);
            }else{
                length = getLength(x_center,y_center,x2,y2);
            }
        }else if(y_center>y1){//矩阵中段
            if(x_center<x1){
                length = getLength(x_center,y_center,x1,y_center);
            }else if(x_center<=x2){
                length = radius*radius;
            }else{
                length = getLength(x_center,y_center,x2,y_center);
            }
        }else{//矩形下方
            if(x_center<x1){
                length = getLength(x_center,y_center,x1,y1);
            }else if(x_center<=x2){
                length = getLength(x_center,y_center,x_center,y1);
            }else{
                length = getLength(x_center,y_center,x2,y1);
            }
        }
        return (radius*radius)>=length;
    }
    public int getLength(int x1,int y1,int x2,int y2){
        int a = x1-x2;
        int b = y1-y2;
        a = a*a;
        b = b*b;
        return a+b;
    }
}
